nanosleep関数は、指定された時間だけ実行を停止します。同様な機能のsleep関数は、停止時間を秒単位で指定しますが、nanosleep関数はナノ秒単位で指定できます。

この関数は、C言語のライブラリ関数(標準関数)ではありませんので、コンパイラにより、使えない場合があります。

#include <sys/time.h>
int nanosleep(const struct timespec *req, struct timespec *rem);

*reqは実行を停止する時間を格納してある造体を指定します。
*remは停止の残り時間を格納する構造体を指定します。

戻り値として、処理が成功した場合は0が、シグナルにより停止が中断されたり、エラーの場合は-1を返します。

nanosleep関数を呼び出して停止中のプロセスにシグナルが送られた場合には、指定された時間に達しなくても停止を解除するとがあります。この場合は戻り値として-1を返し、大域変数errnoにEINTRを設定し、さらに第2引数の*remがNULLでなければ*remに残りの時間を格納します。*remを指定して、nanosleep関数をもう一度呼び出すことにより、指定した時間の停止を完了させることができます。

時間の値を格納するtimespec構造体は、次のように定義してあります。なお、時間の値はtv_secメンバ(秒)とtv_nsecメンバ(ナノ秒)の値を合算したものになります。

struct timespec {
  time_t tv_sec;          /* Seconds.      */
  long int tv_nsec;       /* Nanoseconds.  */
};

次の例題プログラムは、500ミリ秒ずつ5回停止しています。

プログラム 例

#include <stdio.h>
#include <sys/time.h>
#define MILLI_SEC 1000000

int main()
{
  int              cnt;
  struct timespec  req = {0, 500 * MILLI_SEC};

  for (cnt = 0; cnt < 5; ++cnt) {
    printf('実行中!!\n');

    /* 500ミリ秒停止 */
    if (nanosleep(&req, NULL) == -1) {
      perror('');
    }
  }
  printf('終了\n');

  return 0;
}

例の実行結果

$ ./nanosleep.exe
実行中!!
実行中!!
実行中!!
実行中!!
実行中!!
終了
$